import os
import logging
from datetime import datetime

class LoggerSingleton:
    _logger = None

    @classmethod
    def get_logger(cls):
        if cls._logger is None:
            cls._logger = cls._setup_logger()
        return cls._logger
    
    @staticmethod
    def _setup_logger(base_dir="output/log", max_num=7):
        # 获取当前时间并格式化为年月日时分秒
        current_time = datetime.now().strftime("%Y%m%d/%H%M%S")
        
        # 获取当前脚本所在目录的上一级目录
        parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

        # 拼接原来的 `output/log` 目录
        log_base_dir = os.path.join(parent_dir, base_dir)
        log_dir = os.path.join(log_base_dir, current_time.split("/")[0])
        
        # 确保日志目录存在
        os.makedirs(log_dir, exist_ok=True)
        
        # 设置日志文件的路径
        log_file = os.path.join(log_dir, f"{current_time.split('/')[1]}.log")
        
        # 创建日志记录器
        logger = logging.getLogger("LoggerSingleton")  # 使用唯一的 logger 名称
        logger.setLevel(logging.INFO)

        # 避免重复添加 handler
        if not logger.handlers:
            # 创建文件处理器
            file_handler = logging.FileHandler(log_file)
            file_handler.setLevel(logging.INFO)
            
            # 创建控制台处理器
            console_handler = logging.StreamHandler()
            console_handler.setLevel(logging.INFO)
            
            # 创建格式化器
            formatter = logging.Formatter(
                '%(asctime)s - %(levelname)s - file: %(filename)s(line: %(lineno)d) - %(message)s'
            )
            file_handler.setFormatter(formatter)
            console_handler.setFormatter(formatter)
            
            # 添加处理器
            logger.addHandler(file_handler)
            logger.addHandler(console_handler)

        # 记录日志文件路径
        logger.info(f"日志文件已创建: {log_file}")

        # 管理日志文件数量
        log_files = [f for f in os.listdir(log_dir) if f.endswith(".log")]
        log_files.sort()  # 按时间排序
        if len(log_files) >= max_num:
            oldest_log = os.path.join(log_dir, log_files[0])
            os.remove(oldest_log)
            logger.info(f"删除旧日志文件: {oldest_log}")

        return logger
